package pl.mwrobel.activiti.websockets.test; import static com.jayway.restassured.RestAssured.given; import com.jayway.restassured.http.ContentType; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; import org.junit.After; import org.junit.Before; import org.junit.Test; import pl.mwrobel.activiti.websockets.test.utils.ProcessEventDTO; import pl.mwrobel.activiti.websockets.test.utils.ProcessEventsWebSocket; import pl.mwrobel.activiti.websockets.test.utils.ProcessEventsWebSocketConnector; /** * * @author michalw */ public class ActivitiWebsocketsIntegrationTest { private static final String host = "127.0.0.1"; private static final String port = "9080"; private static final String activitiServiceURL = "http://" + host + ":" + port + "/service/"; private static final String USERNAME = "kermit"; private static final String PASSWORD = "kermit"; private static final int HTTP_STATUS_CREATED = 201; private static final int HTTP_STATUS_SUCCESSFUL = 200; private static final int HTTP_STATUS_NOT_FOUND = 404; private ProcessEventsWebSocketConnector con; @Before public void setUp() throws Exception { con = new ProcessEventsWebSocketConnector(host, port); con.init(); } @After public void tearDown() { con.close(); System.out.println("closed connection"); } @Test public void processShouldComplete() throws InterruptedException, Exception { final ProcessEventsWebSocket ws = con.getProcessEventsWebsocket(); String processInstanceId = createProcessInstance(); ws.addExpectedEventAndWait(15000, ProcessEventDTO.builder() .activityName("user-task").processId(processInstanceId).activityType("ACTIVITY_STARTED") .build()); completeUserTask(processInstanceId); checkIfProcessHasFinished(processInstanceId); } private String createProcessInstance() { String businessKey = UUID.randomUUID().toString(); String url = activitiServiceURL + "runtime/process-instances"; System.out.println(url); String payload = "{\n" + " \"processDefinitionKey\":\"event-demo-process\",\n" + " \"businessKey\":\"" + businessKey + "\" \n" + "}"; String response = given() .contentType(ContentType.JSON) .auth().basic(USERNAME, PASSWORD) .body(payload) .when() .post(url) .then() .assertThat().statusCode(HTTP_STATUS_CREATED) .extract().asString(); HashMap<String, Object> serverResponse = from(response); String processInstanceId = (String) serverResponse.get("id"); return processInstanceId; } private String getUserTaskId(String processInstanceId) { String url = activitiServiceURL + "runtime/tasks?processInstanceId=" + processInstanceId; String response = given() .contentType(ContentType.JSON) .auth().basic(USERNAME, PASSWORD) .when() .get(url) .then() .assertThat().statusCode(HTTP_STATUS_SUCCESSFUL) .extract().asString(); HashMap<String, Object> serverResponse = from(response); Map<String, Object> task = ((List<Map<String,Object>>)serverResponse.get("data")).get(0); String taskId = (String)task.get("id"); return taskId; } private void completeUserTaskByTaskId(String taskId) { String url = activitiServiceURL + "runtime/tasks/" + taskId; String payload ="{\"action\" : \"complete\"}"; given() .contentType(ContentType.JSON) .auth().basic(USERNAME, PASSWORD) .body(payload) .when() .post(url) .then() .assertThat().statusCode(HTTP_STATUS_SUCCESSFUL); } private void completeUserTask(String processInstanceId) { completeUserTaskByTaskId(getUserTaskId(processInstanceId)); } private void checkIfProcessHasFinished(String processInstanceId) { String url = activitiServiceURL + "runtime/process-instances/" + processInstanceId; given() .contentType(ContentType.JSON) .auth().basic(USERNAME, PASSWORD) .when() .get(url) .then() .assertThat().statusCode(HTTP_STATUS_NOT_FOUND); } private HashMap<String, Object> from(String JSONString) { ObjectMapper mapper = new ObjectMapper(); TypeReference<HashMap<String, Object>> typeRef = new TypeReference< HashMap<String, Object>>() { }; try { return mapper.readValue(JSONString, typeRef); } catch (IOException ex) { throw new RuntimeException(ex); } } }